/**	
 * タイトル：	JSON操作类
 * 説明：    	
 *			
 * 会社名：	紹興日創軟件有限公司
 * 変更履歴：	2013/06/21 NIS 何
 *			新規作成
 *
 */
package com.nissoft.framework.util;

import java.util.Date;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.nissoft.framework.util.gson.DateSerializer;
import com.nissoft.framework.util.gson.SqlDateSerializer;
import com.nissoft.framework.util.gson.TimeSerializer;
import com.nissoft.framework.util.gson.TimestampSerializer;

/**
 * @author NIS 何
 * @version 1.0
 * @date: 2013/06/21
 * 
 */
public final class JsonUtil {

	// Gson转换的配置对象
	private GsonBuilder builder;
	// Gson对象
	private Gson g;

	private static JsonUtil defaultJson = new JsonUtil();

	public JsonUtil() {
		builder = new GsonBuilder()
				.serializeNulls()
				.registerTypeAdapter(Date.class, new DateSerializer())
				.registerTypeHierarchyAdapter(java.sql.Date.class,
						new SqlDateSerializer())
				.registerTypeHierarchyAdapter(java.sql.Time.class,
						new TimeSerializer())
				.registerTypeHierarchyAdapter(java.sql.Timestamp.class,
						new TimestampSerializer());
		create();
	}

	public JsonUtil(GsonBuilder builder) {
		this.builder = builder;
		create();
	}

	/**
	 * 重新载入配置,并创建Gson对象
	 * 
	 * @param builder
	 */
	public void setBuilder(GsonBuilder builder) {
		this.builder = builder;
		create();
	}

	/**
	 * 创建Gson对象
	 */
	private void create() {
		g = builder == null ? new Gson() : builder.create();
	}

	/**
	 * 对象转换成Json字符串
	 * 
	 * @param src
	 * @return Json字符串
	 */
	public String toJson(Object src) {

		return (g.toJson(src));
	}

	/**
	 * 复杂对象转换成Json,对泛型对象很有用, 简单对象请用{@link #toJson(Object)}代替
	 * 
	 * 注意：传入的typeToken参数必须是TypeToken的匿名子类 。
	 * 
	 * @param src
	 * @param typeToken
	 */
	public <T> String toJson(Object src, TypeToken<T> typeToken) {

		return (g.toJson(src, typeToken.getType()));
	}

	/**
	 * 把Json字符串转换成指定对象
	 * 
	 * @param src
	 * @param clazz
	 * @return 指定对象
	 */
	public <T> T fromJson(String src, Class<T> clazz) {
		return (g.fromJson(src, clazz));
	}

	/**
	 * 把一个复杂的Json字符串转换成复杂的对象,对泛型对象很有用,简单对象请用{@link #fromJson(String, Class)}代替
	 * 
	 * 注意：传入的typeToken参数必须是TypeToken的匿名子类 。
	 * 
	 * @param src
	 * @param typeToken
	 * @return 指定对象
	 */
	public <T> T fromJson(String src, TypeToken<T> typeToken) {

		return (g.fromJson(src, typeToken.getType()));
	}

	public static String staticToJson(Object src) {
		return defaultJson.toJson(src);
	}

	public static <T> String staticToJson(Object src, TypeToken<T> typeToken) {
		return defaultJson.toJson(src, typeToken);
	}

	public static <T> T staticFromJson(String src, Class<T> clazz) {
		return defaultJson.fromJson(src, clazz);
	}

	public static <T> T staticFromJson(String src, TypeToken<T> typeToken) {
		return defaultJson.fromJson(src, typeToken);
	}
}
